package 刷题.速成清单;

import java.util.Scanner;

// 定义一个名为 SelectionSort 的类，用于实现选择排序算法
public class SelectionSort {
    public static void main(String[] args) {
        // 创建一个 Scanner 对象，用于从控制台读取用户输入
        Scanner in = new Scanner(System.in);

        // 提示用户输入数组的长度，并读取该长度值
        // 输入数组长度
        int n = in.nextInt();

        // 根据用户输入的长度创建一个整数类型的数组
        int[] arr = new int[n];

        // 使用 for 循环，让用户依次输入数组的每个元素
        // 输入数组元素
        for (int i = 0; i < n; i++) {
            // 读取用户输入的元素值，并将其存储到数组的相应位置
            arr[i] = in.nextInt();
        }

        // 调用 selectionSort 方法对数组进行排序
        // 调用选择排序方法
        selectionSort(arr);

        // 使用增强 for 循环遍历排序后的数组
        // 输出排序后的数组
        for (int num : arr) {
            // 打印数组中的每个元素，并在元素后面添加一个空格
            System.out.print(num + " ");
        }

        // 关闭 Scanner 对象，释放资源
        in.close();
    }

    // 定义一个静态方法 selectionSort，用于实现选择排序算法
    public static void selectionSort(int[] arr) {
        // 获取数组的长度
        int n = arr.length;

        // 外层循环控制当前要确定最小值的位置，需要进行 n - 1 次选择
        // 因为最后一个元素在前面的元素都排好序后，自然就处于正确的位置了
        for (int i = 0; i < n - 1; i++) {
            // 假设当前索引 i 对应的元素是未排序部分的最小值
            int minIndex = i;

            // 内层循环用于遍历未排序部分的元素，找到其中的最小值
            for (int j = i + 1; j < n; j++) {
                // 如果当前遍历到的元素 arr[j] 比假设的最小值 arr[minIndex] 还要小
                if (arr[j] < arr[minIndex]) {
                    // 更新最小值的索引为 j
                    minIndex = j;
                }
            }

            // 内层循环结束后，找到了未排序部分的最小值所在的索引 minIndex
            // 将最小值与当前位置 i 的元素进行交换
            int temp = arr[minIndex];
            arr[minIndex] = arr[i];
            arr[i] = temp;
        }
    }
}